來到了第六天,意味著即將完成鐵人賽1/5的旅程!今天就讓我們來看看什麼是 pure function
吧(´⊙ω⊙`)
A Pure function is a function where the return value is only determined by its arguments without any side effects. i.e, If you call a function with the same arguments 'n' number of times and 'n' number of places in the application then it will always return the same value.
純函式是一種回傳值只受到傳入的引數影響
,而不會受到其他副作用
影響的函式。也就是說,如果你在應用程式中使用到這一個函式,只要帶入的引數是相同的,每次的回傳值也都會是相同的。
而與之相反,若回傳值會受到其他副作用所影響,那麼這個函式就是 非純函式impure function
,接下來就讓我們來看看impure function與pure function的範例:
今天的範例有用到
箭頭函式
和curry化
喔!試著看懂它吧~
//Impure 帶入同一個引數,卻得到不同結果,且會改變外面變數的值
let alreadyDrink = 0
const drinkWaterImpure = water => alreadyDrink += water
console.log(drinkWaterImpure(100)) // 100
console.log(drinkWaterImpure(100)) // 200
console.log(alreadyDrink) // 200
//Pure 帶入同一個引數,每次回傳值都一樣,且不會改變到外面變數的值
const drinkWaterPure = water => drinkedWater => drinkedWater += water
console.log(drinkWaterPure(100)(alreadyDrink)) // 300
console.log(drinkWaterPure(100)(alreadyDrink)) // 300
console.log(alreadyDrink) // 200
第一個函式 - 非純函式
的部分,在內部的運算式中拿了外面的變數進來使用,並且在執行時令這個變數加上我們傳進來的引數。我們會發現,執行這個函式N次,會得到N種不同的結果。且執行完這個非純函式後,變數alreadyDrink也被改變了。
而第二個函式 - 純函式
,每次帶入同一個引數,都會得到一樣的回傳值。即時執行這個純函式N次,原本的變數alreadyDrink也沒有被改變。
其實我們可以發現,如果一個函式有從外面拿東西進來用,並且改變它,就會產生副作用,那麼這個函式就是非純函式。而純函式是非常重要的,因為這可以簡化單元測試(不會有副作用),而且無需相依注入
。純函式也可以避免緊密的耦合
,並且可以讓應用程式因為沒有副作用而更難被破壞。這些原則與ES6的不變性一同讓 const 的用途勝過於 let 。
明天就是function這個小主題的最後一篇囉,最後就來看看什麼是 閉包Closure
吧ヽ(́◕◞౪◟◕‵)ノ
其實在這個面試題彙整原本的地方What is a pure function,給的範例是分別使用陣列的兩種方法: Push
和Concat
來演示純函式與非純函式。
所以,在使用JavaScript方法時,要留意它是純的還是不純的喔( • ̀ω•́ )